package org.wheel.plugins.toolkit.sql.helper;

import cn.hutool.core.util.StrUtil;
import lombok.Getter;
import lombok.Setter;
import org.wheel.plugins.toolkit.sql.spi.register.AnnotationRegistry;
import org.wheel.plugins.toolkit.sql.spi.register.FieldRoleRegistry;

import java.lang.reflect.Field;

/**
 * 字段元数据：Java 属性 ↔ 数据库列名
 */
@Getter
public final class FieldMeta {
    private final Class<?> fieldType;
    private final String fieldName;
    private final String column; // 数据库列名
    private final boolean isPrimaryKey;
    /**
     * 角色,用于注入 FieldRoleSpi， 对于是否删除字段，更新字段等自定义字段，统一使用 role
     */
    @Setter
    private String role;

    public FieldMeta(Field field) {
        this.fieldName = field.getName();
        /* 关键改动：不再直接拿 Column.class，而是注册中心里“第一命中”的注解 */
        this.column = AnnotationRegistry.findColumn(field)
                .map(colAnno -> StrUtil.blankToDefault(colAnno.value(),
                        StrUtil.toUnderlineCase(fieldName)))
                .orElse(StrUtil.toUnderlineCase(fieldName));
        this.fieldType = field.getType();
        this.isPrimaryKey = AnnotationRegistry.hasId(field);
    }
    /* 包内可见，仅用于本类判断 */
    private void ensureRole() {
        if (this.role == null) {                // 第一次检查
            synchronized (this) {               // 加锁
                if (this.role == null) {        // 第二次检查
                    // 让注册中心兜底加载
                    FieldRoleRegistry.ensureInitialized();
                    // 重新给自己赋值
                    this.role = FieldRoleRegistry.getRole(this.column);
                }
            }
        }
    }
    /* ---------- 快捷判断 ---------- */
    public boolean isLogicDelete() {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_LOGIC_DELETE.equals(role);
    }
    public boolean isCreateTime()  {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_CREATE_TIME.equals(role);
    }
    public boolean isUpdateTime() {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_UPDATE_TIME.equals(role);
    }
    public boolean isCreateBy() {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_CREATE_BY.equals(role);
    }
    public boolean isUpdateBy() {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_UPDATE_BY.equals(role);
    }
    public boolean isTenantId()    {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_TENANT_ID.equals(role);
    }
    public boolean isDisplayStatus() {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_DISPLAY_STATUS.equals(role);
    }
    public boolean isVersion()     {
        ensureRole();
        return FieldRoleConst.KEY_ROLE_VERSION.equals(role);
    }

}